package com.yyh.service.impl;

import com.yyh.entity.Modules;
import com.yyh.mapper.ModulesMapper;
import com.yyh.mapper.RolemodulesMapper;
import com.yyh.service.IModulesService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author yangyueheng
 * @since 2020-06-02
 */
@Service
public class ModulesServiceImpl extends ServiceImpl<ModulesMapper, Modules> implements IModulesService {
	@Autowired
	RolemodulesMapper rolemodulesMapper;
	@Autowired
	ModulesMapper modulesMapper;
	
	List<Integer> moduleIds;
	@Override
	  public List<Modules> getModulesTree() {
	    List<Modules> tree = new ArrayList<>();
	    //全查，查询出所有的模块
	    List<Modules> list = this.baseMapper.selectList(null);
	    //遍历，判断是否为根节点，若是，则加入树中，同时，给这个节点找孩子，设置子节点。
	    for(Modules m:list) {
	      if(m.getParentId()!=null && m.getParentId()==0) {
	        tree.add(findChildren(m, list));
	      }
	    }
	    return tree;
	  }
	  
	  
	  //递归
	  public Modules findChildren(Modules m, List<Modules> list) {
	    for (Modules item : list) {
	    	if(moduleIds!=null && moduleIds.contains(item.getId())) {
		    	  item.setChecked(true);
		      }
	      if (m.getId() == item.getParentId()) {
	        if (m.getChildren() == null) {
	          m.setChildren(new ArrayList<Modules>());
	        }
	        m.getChildren().add(findChildren(item, list));
	      }
	    }
	    return m;
	  }
	  @Override
		public List<Modules> getModulesTreeByRoleId(Integer rid) {
			// 声明一个集合存储 指定角色对应的模块id
			moduleIds = rolemodulesMapper.getModuleIdsByRoleId(rid);
			//声明一个集合用来存储最终结果
			List<Modules> tree = new ArrayList<>();
			//全查，查询出所有模块
			List<Modules> list = modulesMapper.selectList(null);
			//遍历，判断是否为根节点，若是，则加入在树中，同时，给这个节点找孩子，设置子节点
			for(Modules m:list) {
				if(m.getParentId()!=null && m.getParentId()==0) {
					tree.add(findChildren(m,list));
				}
			}
			//设置父节点为false
			for(Modules m1: tree) {
				m1.setChecked(false);
			}
			return tree;
		}
	  @Override
	  public List<Modules> getModulesTreeByUserId(Integer uid) {
		  	moduleIds = null;
		    List<Modules> tree = new ArrayList<>();
		    //全查，查询出所有的模块
		    //List<Modules> list = this.baseMapper.selectList(null);
		    //遍历，判断是否为根节点，若是，则加入树中，同时，给这个节点找孩子，设置子节点。
		    List<Modules> list = rolemodulesMapper.getModulesTreeByUserId(uid);
		    for(Modules m:list) {
		      if(m.getParentId()!=null && m.getParentId()==0) {
		        tree.add(findChildren(m, list));
		      }
		    }
		    return tree;
		  }
}
